package com.jml.hystrix.令牌桶算法.controller;


import com.google.common.util.concurrent.RateLimiter;
import com.jml.hystrix.service.MemberService;
import com.jml.hystrix.令牌桶算法.AOP.ExtRateLimiter;
import com.jml.hystrix.令牌桶算法.OrderService;
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class RateLimiterController {

	@Autowired
	private OrderService orderService;
	// 解释：1.0 表示 每秒中生成1个令牌存放在桶中
	// 解释：10.0 表示 每秒中生成10个令牌存放在桶中
	RateLimiter rateLimiter = RateLimiter.create(1.0);
	// 下单请求
	@RequestMapping("/order")
	public String order() {
		//rateLimiter.acquire()客户端从桶中获取对应的令牌，返回值是拿到令牌所等待的时间
		//如果获取不到令牌就会一直等待
		//System.out.println("生成令牌等待时间:" + rateLimiter.acquire());
		//如果500毫秒内没有获取令牌直接走服务降级处理
		//rateLimiter.tryAcquire这个方法里面已经包含了rateLimiter.acquire()
		boolean acquire = rateLimiter.tryAcquire(500, TimeUnit.MILLISECONDS);
		if (!acquire) {//服务降级
			System.out.println("你在怎么抢，也抢不到，因为会一直等待的，你先放弃吧！");
			return "你在怎么抢，也抢不到，因为会一直等待的，你先放弃吧！";
		}
		// 2.获取令牌后调用接口
		boolean isOrderAdd = orderService.addOrder();
		if (isOrderAdd) {
			System.out.println("恭喜您,抢购成功!");
			return "恭喜您,抢购成功!";
		}
		System.out.println("抢购失败!");
		return "抢购失败!";
	}


	@ExtRateLimiter(value = 1.00,timeOut = 50)
	@RequestMapping("/orderAnnotation")
	public String orderAnnotation() {
		boolean isOrderAdd = orderService.addOrder();
		if (isOrderAdd) {
			System.out.println("恭喜您,抢购成功!");
			return "恭喜您,抢购成功!";
		}
		System.out.println("抢购失败!");
		return "抢购失败!";
	}

}

